import cv2
import numpy as np


if __name__ == '__main__':
    # 读取图像
    image = cv2.imread('poker.jpg')
    # 转换为灰度图像
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    # 创建图像模板，及感兴趣区域
    roi = gray[69:109:,230:267]
    #显示模板
    cv2.imshow('roi', roi)
    # 进行模板匹配
    match = cv2.matchTemplate(gray,roi,cv2.TM_CCOEFF_NORMED)
    # 设定阈值
    threshold = 0.8
    # 找到匹配的位置，，它是一个元组，包含两个数组，分别对应满足条件（即匹配值大于等于阈值）的元素的行索引和列索引。
    loc = np.where(match >= threshold)
    # 打印匹配的位置
    print(loc)
    #loc[::-1]：这是对 loc 元组进行反转操作。[::-1] 是 Python 里的切片语法，用于反转序列。反转后，原本的列索引数组在前，行索引数组在后。
    #*loc[::-1]：* 是解包操作符，它把 loc[::-1] 这个元组里的数组解包成独立的参数传递给 zip 函数。
    #zip 函数用于将多个可迭代对象中对应位置的元素组合成元组，返回一个迭代器。这里 zip 把解包后的列索引数组和行索引数组中对应位置的元素组合成 (列索引, 行索引) 形式的元组。

    """
    在 OpenCV 里，cv2.rectangle 函数需要矩形左上角的坐标作为参数。通过 np.where 得到的行索引和列索引是分开存储的，借助 zip 函数能把它们组合成 (x, y) 形式的坐标对，这样就能方便地在图像上绘制矩形框。
    """
    # # 遍历匹配的位置
    # for pt in zip(*loc[::-1]):
    #     # 绘制矩形框,  (pt[0] + 37, pt[1] + 40)是指的矩形框的右下角的坐标，通过加37和40来调整矩形框的大小，以适应模板的大小。
    #     cv2.rectangle(image, pt, (pt[0] + 37, pt[1] + 40), (0, 0, 255), 2)
    # 或者
    w,h = roi.shape[0:2]
    for pt in zip(*loc[::-1]):
        x1,y1 = pt[0],pt[1]
        x2,y2 = pt[0] + w,pt[1] + h
        cv2.rectangle(image, (x1,y1),(x2,y2), (0, 0, 255), 2)

    # 显示图像
    cv2.imshow('image', image)

    # 等待按键
    if cv2.waitKey(0) & 0xFF == ord('q'):
        cv2.destroyAllWindows()

    # 退出程序
    exit(0)